/* PROGRAM TO SUM THE SQUARES OF THE ELEMENTS OF A VECTOR */
/*   COMPILED FOR A COLDFIRE MCF5282 PROCESSOR            */
#include <studio.h>
#define LENGTH 5

void sumsq (int *total, int size, int array[]);

short int data[] ={2,3,5,7,9};
short int sum;
	
int main(
{
	sumsq(&sum, LENGTH, data[]);
        output(sum);  calls operating system trap
}
		
void sumsq (int *sum, int size, int array[])
{
        int total=0;
	for (int i = size-1; i < 0; i--)
	   total= total + array[i]**2;	
	sum=total;
}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

; PROGRAM TO SUM THE SQUARES OF THE ELEMENTS OF A VECTOR 
;   COMPILED FOR A COLDFIRE MCF5282 PROCESSOR

;       -Assembly Statements-                                          -Address  Contents-         -CPU Cycles(Mem Reads/
;                                                                                                           Mem Writes)-  
	.org 0x3000		  ; arbitrarily placed program here
;  VARIABLES
data:	dc.w	2,3,5,7,9	  ; define data array			0x3000  0002 0003 0005 0007 0009
sum:	ds.w	1		  ; set aside space for sum		0x300A  ????

;  MAIN FUNCTION 	
main:	link    a6, #0		  ; called function overhead: a6=sp	0x300C  4E56 0000		 2(0/1)
	movem.l do-d7/a0-a5,-(sp) ;   push all registers		0x3010  48D7 3FFF		15(0/14)
	pea	sum		  ; push addr of sum onto stk		0x3014  487A FFFA		 2(0/1)
	move.w	#5,-(sp)	  ; push #5 onto stack			0x3018  3F3C 0005		 3(1/1)
	pea	data		  ; push addr of data onto stk		0x301C  487A FFE8		 2(0/1)
	jsr	sumsq		  ; jump to subr sumsq			0x3020  4EBA 0004 		 3(0/1)
        trap    #2		  ; trap to vector 2			0x3024  4E42			15(1/2)
        movem.l (sp)+,do-d7/a0-a5 ; called function overhead: pop regs	0x3026  4CD7 3FFF		15(14/0)
        unlk 	a6		  ;   restore a6			0x302A  4E5D			 2(1/0)
        move.l  (sp),(-2,sp)	  ;   move return adress		0x302C  2F57 FFFE		 3(1/1)
	move.w	#0,(sp)		  ;   return 0: no error		0x3030  3EBC 0000		 3(0/1)
        adda.l  #-2,sp		  ;   clean up stack			0x3034  EFFC FFFF FFFE		 1(0/0)
	rts			  ; return from main			0x303A  4E75			 5(1/0)

;  SUMSQ FUNCTION	
sumsq:	link	a6,#0		  ; called function overhead: a6=sp	0x303C  4E56 0000		 2(0/1)
	movem.l	d0-d2/a0-a1,-(sp) ; push reg onto stk			0x3040  48D7 0307		 6(0/5)
	movea.l	(8,a6),a0	  ; load a0 with addr of array		0x3044  206E 0008		 3(1/1)
	move.w	(12,a6),d1	  ; load d1 with size			0x3048  322E 000C		 3(1/0)
	movea.l	(14,a6),a1	  ; load a1 with addr of sum		0x304C  222E 000E		 3(1/1)
	moveq	#0,d0		  ; d0=0 (accumulator)			0x3050  7000			 1(0/0)
	subq.l	#1,d1		  ; dec d1 (counter)			0x3052  5381			 1(0/0)
loop:	move.w	(a0)+,d2	  ; pop array element into d2		0x3054  30C2			 3(1/0)
	mulu	d2,d2		  ; square array element		0x3056  C4C2			 4(0/0)
	add.l	d2,d0		  ; add sq to d0			0x3058  D082			 1(0/0)
	subq.l	#1,d1		  ; dec d1				0x305A  5381			 1(0/0)
	bne	loop		  ; branch if not done			0x305C  66F6			 2(0/0)  3(0/0)
	move.w	d0,(a1)		  ; store sum				0x305E  3280			 1(0/1)
	movem.l	(sp)+,do-d2/a0-a1 ; called function overhead: pop regs	0x3060  4CD7 0307		 6(5/0)
	unlk	a6		  ;   restore a6			0x3064  4E5D			 2(1/0)
	move.l	(sp),(10,sp)	  ;   move return address		0x3066  2F57 000A		 3(1/1)
	adda.l	#10,sp		  ;   clean up the stack		0x306A	EFFC 0000 000A		 1(0/0)
	rts			  ; return from subr			0x3070  4E75			 5(1/0)
	end
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
STACK:
	Memory Addr       Contents
 sp -->	0xFFFF FF9A	xxxx xxxx  a1              top of stack in middle of sumsq
	0xFFFF FF9E	xxxx xxxx  a0
	0xFFFF FFA2	xxxx xxxx  d2
	0xFFFF FFA6	xxxx xxxx  d1
	0xFFFF FFAA	xxxx xxxx  d0
	0xFFFF FFAE	xxxx xxxx  a6              sp -> a6
	0xFFFF FFB2	xxxx xxxx  return PC addr
	0xFFFF FFB6	xxxx xxxx  addr of data
	0xFFFF FFBA	0005       #5
	0xFFFE FFBC	xxxx xxxx  addr of sum
	0xFFFE FFC0     xxxx xxxx  a5              top of stack before calling sumsq, & after return to main
	0xFFFE FFC4     xxxx xxxx  a4
	0xFFFE FFC8     xxxx xxxx  a3
	0xFFFE FFCC     xxxx xxxx  a2
	0xFFFE FFD0     xxxx xxxx  a1
	0xFFFE FFD4     xxxx xxxx  a0
	0xFFFE FFD8     xxxx xxxx  d7
	0xFFFE FFDC     xxxx xxxx  d6
	0xFFFE FFE0     xxxx xxxx  d5
	0xFFFE FFE4     xxxx xxxx  d4
	0xFFFE FFE8     xxxx xxxx  d3
	0xFFFE FFEC     xxxx xxxx  d2
	0xFFFE FFF0     xxxx xxxx  d1
	0xFFFE FFF4     xxxx xxxx  d0
	0xFFFE FFF8	xxxx xxxx  a6              sp -> a6
	0xFFFE FFFC	xxxx xxxx  return PC addr  top of stack at beginning of main
 	0xFFFF 0000	???? ????
	......„ 65535 f